package com.design_patterns.strategy;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-08-23 17:34
 **/
public class Main {

    /**
     * 里氏替换原则 :
     *  父类出现的地方子类就可以出现
     */

    /**
     * 策略模式就是对某种事物的多种情况采用不同的策略
     * 也就是说我们可以编写一个 interface 定义好要是实现的方法名称和参数,用来抽象实现方法
     * 有了抽象方法其他具体的实现类就可以继承或实现这个接口
     * 在实际使用中,根据里氏替换原则,我们可以向实现方法中传递不同的策略来满足不同的需求
     * 说到底其实是JAVA 多态的一种表现
     *
     */

    /**
     * 开闭原则:对修改关闭,修扩展开放
     */
    public static void main(String[] args) {
        strategy();
    }


    /**
     * 默认输出
     */
    public static void say() {
        SayColor<Red> sayColor = new SayColor<>();
        sayColor.sayColor(new Red());
    }

    /**
     * 策略输出
     */
    public static void strategy() {
        SayColor<Red> sayColor = new SayColor<>();
        sayColor.sayColor(new Red(), new RedSayOther());

        SayColor<Blue> sayColor1 = new SayColor<>();
        sayColor1.sayColor(new Blue(), new BlueSayOther());

        sayColor.sayColor(new Red(), new RedSay());
        sayColor1.sayColor(new Blue(), new BlueSay());
//
        sayColor.sayColor(new Red(), new ColorFunction<Red>() {
            @Override
            public void say(Red red) {
                System.err.println("可以使用函数编程随时创建自定模式");
                red.sayColor();
            }
        });
//




    }


}
